<!DOCTYPE html>
<html lang="en">

<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8">
	<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
	
	<!-- title -->
	
	<title>
	
		03.工具包 | 
	 
	对线面试官
	</title>
	
	<!-- keywords,description -->
	 
		<meta name="description" content="Java一线大厂面试" />
	

	<!-- favicon -->
	
	<link rel="shortcut icon" href="/luffy/favicon.ico">
	


	<!-- search -->
	<script>
		var searchEngine = "https://www.baidu.com/s?wd=";
		if(typeof searchEngine == "undefined" || searchEngine == null || searchEngine == ""){
			searchEngine = "https://www.google.com/search?q=";
		}
		var homeHost = "";
		if(typeof homeHost == "undefined" || homeHost == null || homeHost == ""){
			homeHost = window.location.host;
		}
	</script>


	
<link rel="stylesheet" href="/luffy/css/main.css">

	
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">

	
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.17.1/build/styles/darcula.min.css">

	
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css">


	
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>

	
<script src="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>

	
<script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.17.1/build/highlight.min.js"></script>

	
<script src="https://cdn.jsdelivr.net/npm/jquery-pjax@2.0.1/jquery.pjax.min.js"></script>

	
<script src="/luffy/js/main.js"></script>

	
		
<script src="https://cdn.jsdelivr.net/npm/leancloud-storage/dist/av-min.js"></script>

		
<script src="https://cdn.jsdelivr.net/npm/valine@1.3.10/dist/Valine.min.js"></script>

	
	
<meta name="generator" content="Hexo 5.4.0"></head>

<body>
	<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?3efe99c287df5a1d6f0d02d187e403c1";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>

<header id="header">
    <a id="title" target="_blank" rel="noopener" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4NzA3MTc5Mg==&action=getalbum&album_id=1657204970858872832&scene=126#wechat_redirect" class="logo">对线面试官</a>

	<ul id="menu">
		
	

	

		<li class="menu-item">
			<a href="https://gitee.com/zhongfucheng/Java3y" class="menu-item-link" target="_blank">
				【戳这里】获取更多原创干货💪💪
			</a>
		</li>
		<li class="menu-item">
			<a href="https://gitee.com/zhongfucheng/Java3y" class="menu-item-link" target="_blank">
				<i class="fa fa-github fa-2x"></i>
			</a>
		</li>
	</ul>
</header>

	
<div id="sidebar">
	<button id="sidebar-toggle" class="toggle" ><i class="fa fa-arrow-right " aria-hidden="true"></i></button>
	
	<div id="site-toc">
		<input id="search-input" class="search-input" type="search" placeholder="按回车全站搜索">
		<div id="tree">
			

			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										00-面试前准备
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/30/00-%E9%9D%A2%E8%AF%95%E5%89%8D%E5%87%86%E5%A4%87/01.%E7%AE%80%E5%8E%86/">
										01.简历
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										01-Java基础
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/01.%20%E6%B3%A8%E8%A7%A3/">
										01. 注解
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/02.%20%E6%B3%9B%E5%9E%8B/">
										02. 泛型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/03.%20JavaNIO/">
										03. JavaNIO
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/04.%20%E5%8F%8D%E5%B0%84%E5%92%8C%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/">
										04. 反射和动态代理
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										02-Java并发
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/01.%20%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%9F%BA%E7%A1%80/">
										01. 多线程基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/02.%20CAS/">
										02. CAS
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/03.%20synchronized/">
										03. synchronized
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/04.%20AQS%E5%92%8CReentrantLock/">
										04. AQS和ReentrantLock
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/05.%20%E7%BA%BF%E7%A8%8B%E6%B1%A0/">
										05. 线程池
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/06.%20ThreadLocal/">
										06. ThreadLocal
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/07.%20CountDownLatch%E5%92%8CCyclicBarrier/">
										07. CountDownLatch和CyclicBarrier
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/08.%20%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81Java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/">
										08. 为什么需要Java内存模型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/09.%20%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BAJava%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/">
										09. 深入浅出Java内存模型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										03-Java容器
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/03-Java%E5%AE%B9%E5%99%A8/01.%20List%E9%9B%86%E5%90%88/">
										01. List集合
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/03-Java%E5%AE%B9%E5%99%A8/02.%20Map%E9%9B%86%E5%90%88/">
										02. Map集合
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										04-Java虚拟机
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/01.%20Java%E7%BC%96%E8%AF%91%E5%88%B0%E6%89%A7%E8%A1%8C%E7%9A%84%E8%BF%87%E7%A8%8B/">
										01. Java编译到执行的过程
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/02.%20%E5%8F%8C%E4%BA%B2%E5%A7%94%E6%B4%BE%E6%9C%BA%E5%88%B6/">
										02. 双亲委派机制
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/03.%20JVM%E5%86%85%E5%AD%98%E7%BB%93%E6%9E%84/">
										03. JVM内存结构
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/04.%20%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6/">
										04. 垃圾回收机制
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/05.%20CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8/">
										05. CMS垃圾收集器
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/06.%20G1%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8/">
										06. G1垃圾收集器
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/24/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/07.%20JVM%E8%B0%83%E4%BC%98/">
										07. JVM调优
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										05-Spring
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/05-Spring/01.%20SpringMVC/">
										01. SpringMVC
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/05-Spring/02.%20Spring%E5%9F%BA%E7%A1%80/">
										02. Spring基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/05-Spring/03.%20SpringBean%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/">
										03. SpringBean生命周期
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										06-Redis
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/06-Redis/01.%20Redis%E5%9F%BA%E7%A1%80/">
										01. Redis基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/06-Redis/02.%20Redis%E6%8C%81%E4%B9%85%E5%8C%96/">
										02. Redis持久化
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/06-Redis/03.%20Redis%E4%B8%BB%E4%BB%8E%E6%9E%B6%E6%9E%84/">
										03. Redis主从架构
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/06-Redis/04.%20Redis%E5%88%86%E7%89%87%E9%9B%86%E7%BE%A4/">
										04. Redis分片集群
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										07-消息队列
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/07-%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/01.%20Kafka%E5%9F%BA%E7%A1%80/">
										01. Kafka基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/07-%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/02.%20%E4%BD%BF%E7%94%A8Kafka%E4%BC%9A%E8%80%83%E8%99%91%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98/">
										02. 使用Kafka会考虑什么问题
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										08-MySQL
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/08-MySQL/01.%20MySQL%E7%B4%A2%E5%BC%95/">
										01. MySQL索引
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/08-MySQL/02.%20MySQL%E4%BA%8B%E5%8A%A1%E5%92%8C%E9%94%81%E6%9C%BA%E5%88%B6%E5%92%8CMVCC/">
										02. MySQL事务和锁机制和MVCC
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/08-MySQL/03.%20MySQL%E8%B0%83%E4%BC%98/">
										03. MySQL调优
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										09-项目场景类
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/09-%E9%A1%B9%E7%9B%AE%E5%9C%BA%E6%99%AF%E7%B1%BB/01.%20%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%8E%BB%E9%87%8D%E5%92%8C%E5%B9%82%E7%AD%89/">
										01. 如何实现去重和幂等
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/09-%E9%A1%B9%E7%9B%AE%E5%9C%BA%E6%99%AF%E7%B1%BB/02.%20%E7%B3%BB%E7%BB%9F%E9%9C%80%E6%B1%82%E5%A4%9A%E5%8F%98%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1/">
										02. 系统需求多变如何设计
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/09-%E9%A1%B9%E7%9B%AE%E5%9C%BA%E6%99%AF%E7%B1%BB/03.%20%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">
										03. 设计模式
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										10-计算机网络
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/25/10-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/01.%20HTTP/">
										01. HTTP
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/13/10-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/02.TCP%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%92%8C%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B/">
										02.TCP三次握手和四次挥手
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										11-算法
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/09/01/11-%E7%AE%97%E6%B3%95/01.%20%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/">
										01. 排序算法
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/09/02/11-%E7%AE%97%E6%B3%95/02.%20LeetCode%20Easy/">
										02. LeetCode Easy
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/09/02/11-%E7%AE%97%E6%B3%95/02.%20LeetCode%20Medium/">
										02. LeetCode Medium
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										12-austin项目
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/01/12-austin%E9%A1%B9%E7%9B%AE/00.%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/">
										00.项目介绍
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/30/12-austin%E9%A1%B9%E7%9B%AE/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
										01.环境搭建
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/30/12-austin%E9%A1%B9%E7%9B%AE/02.%E6%97%A5%E5%BF%97/">
										02.日志
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file active">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/03.%E5%B7%A5%E5%85%B7%E5%8C%85/">
										03.工具包
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/04.%E4%BB%8E%E4%B8%80%E6%9D%A1%E7%9F%AD%E4%BF%A1%E5%BC%80%E5%A7%8B/">
										04.从一条短信开始
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/05.%E9%80%89%E6%8B%A9%E6%95%B0%E6%8D%AE%E5%BA%93%E5%92%8C%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B/">
										05.选择数据库和技术选型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/06.MySQL%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
										06.MySQL环境搭建
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/07.Kafka%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
										07.Kafka环境搭建
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
		</div>
	</div>
</div>

	<!-- 引入正文 -->
	<div id="content">
		<h1 id="article-title">

	03.工具包
</h1>
<div class="article-meta">
	
	<span>3y</span>
	<span>2021-11-24 08:33:51</span>
		<div id="article-categories">
    
		<span>Categories：</span>
            
    

    
		<span>Tags：</span>
            
    
		</div>

</div>

<div id="article-content">
	<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247501926&idx=1&sn=9fd2996baa50ce04c3569c490e15299c&chksm=ebd48967dca30071126d6d1d3f5eb08cf8a0d818a3c951c7dcc6bedb3c124f3d0c5166622379&token=358461825&lang=zh_CN#rd">第零篇</a>简单介绍了austin项目做什么用的，这两个月我重点会实现哪一块内容。</p>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247501892&idx=1&sn=9352f83e2a15003fb5ea61b83c569680&chksm=ebd48945dca3005371df9858c9347cea95b7a1424eb290659b781d3e07704b3207a3fce5126d&token=358461825&lang=zh_CN#rd">第一篇</a>用Maven+SpringBoot搭好了项目的架子，以及聊了下我对SpringBoot和Maven的看法。</p>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247501980&idx=1&sn=f2cb49ee1e40e529f31e588b062a1a23&chksm=ebd4899ddca3008b67bab1599edb5184b993c96806c6efee750863a6f7b46e6e54f1f72a4be0&token=970948001&lang=zh_CN#rd">第二篇</a>聊了下很容易被大家忽略的日志（这在项目中是非常重要的）</p>
<p>这是austin项目系列的第三篇了，今天继续来聊聊Java项目的前期准备吧（文章到目前为止还是新建文件夹状态，但项目已经是开始写代码的啦）</p>
<p>这一篇来讲讲给开发提速的东西了：<strong>工具包</strong>、<strong>Lombok</strong>和<strong>常用库</strong></p>
<h2 id="01、什么是工具包"><a href="#01、什么是工具包" class="headerlink" title="01、什么是工具包"></a>01、什么是工具包</h2><p>基本上，每个项目里都有一个包，叫做<code>utils</code>。这个包专门承载我们自己项目的工具类，比如常见的<code>DateUtils</code>、<code>HttpUtils</code>、<code>Collections</code></p>
<p>所谓Utils就是：<strong>这个东西我们用得很多，但是原API不够好用，于是我们给它封装为一个比较通用的方法</strong></p>
<p>如果是初学者，很多时候遇到这种类似的工具类也不会直接自己开写，会先去搜索引擎里找一通。找到了之后，看起来觉得可以就直接一个<code>ctrl+c </code>，一个<code>ctrl +v </code>往自己的<code>main</code>方法一贴，搞点测试数据，看能不能work起来。</p>
<p>能work起来，那就给它取个名字，放在<code>utils</code>包下。一顿操作过后，发现自己这操作姿势就是完美！</p>
<p>殊不知，你想要的工具类<strong>很可能</strong>人家已经写好对应的<code>jar</code>包，比某搜索引擎查到的某博客的代码可靠多了。</p>
<p>知道有此类<code>jar</code> 的人用得一直很香，不知道的人可能就一直缺什么就去拷贝什么，代码搞得非常脏乱。</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvzpkhduocj30zk05owev.jpg"></p>
<h2 id="02、Java工具包推荐"><a href="#02、Java工具包推荐" class="headerlink" title="02、Java工具包推荐"></a>02、Java工具包推荐</h2><p>在Java领域里，在业内比较出名的工具包有两个：<code>commons</code>和<code>guava</code></p>
<p>国人维护的一个工具包：<code>Hutool</code></p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvzpl11zr5j318k060glx.jpg"></p>
<p>如果有相关的需求的话，我们在项目代码中可以尽可能使用这些工具包。它们的代码<strong>一般情况下</strong>都会比我们自己写的要好，而且工具类就是为了帮我们减少重复性代码的，多用会使项目的可读性变得更高。</p>
<p>至于它们能干什么，如果没了解过的可以先逛下他们的<code>Guide</code>，稍微了解下这些工具包封装了什么功能。等到自己要意识到需要封装某个功能时，先把这些工具包的文档给逛一遍，<strong>真的找不到时，没有再自己实现</strong>。</p>
<p>不要重复造轮子，不要重复造轮子，不要重复造轮子。</p>
<p>我贴下这些工具包的链接🔗 大家如果对这个不了解的话，建议去看看</p>
<ul>
<li><a target="_blank" rel="noopener" href="https://commons.apache.org/">https://commons.apache.org/</a></li>
<li><a target="_blank" rel="noopener" href="https://github.com/google/guava/wiki">https://github.com/google/guava/wiki</a></li>
<li><a target="_blank" rel="noopener" href="https://www.hutool.cn/docs/#/">https://www.hutool.cn/docs/#/</a></li>
</ul>
<p>我截取<code>hutool</code>文档的一部分信息，大家稍微可以感受下，我个人认为还是比较全的：</p>
<table>
<thead>
<tr>
<th>模块</th>
<th>介绍</th>
</tr>
</thead>
<tbody><tr>
<td>hutool-aop</td>
<td>JDK动态代理封装，提供非IOC下的切面支持</td>
</tr>
<tr>
<td>hutool-bloomFilter</td>
<td>布隆过滤，提供一些Hash算法的布隆过滤</td>
</tr>
<tr>
<td>hutool-cache</td>
<td>简单缓存实现</td>
</tr>
<tr>
<td>hutool-core</td>
<td>核心，包括Bean操作、日期、各种Util等</td>
</tr>
<tr>
<td>hutool-cron</td>
<td>定时任务模块，提供类Crontab表达式的定时任务</td>
</tr>
<tr>
<td>hutool-crypto</td>
<td>加密解密模块，提供对称、非对称和摘要算法封装</td>
</tr>
<tr>
<td>hutool-db</td>
<td>JDBC封装后的数据操作，基于ActiveRecord思想</td>
</tr>
<tr>
<td>hutool-dfa</td>
<td>基于DFA模型的多关键字查找</td>
</tr>
<tr>
<td>hutool-extra</td>
<td>扩展模块，对第三方封装（模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等）</td>
</tr>
<tr>
<td>hutool-http</td>
<td>基于HttpUrlConnection的Http客户端封装</td>
</tr>
<tr>
<td>hutool-log</td>
<td>自动识别日志实现的日志门面</td>
</tr>
<tr>
<td>hutool-script</td>
<td>脚本执行封装，例如Javascript</td>
</tr>
<tr>
<td>hutool-setting</td>
<td>功能更强大的Setting配置文件和Properties封装</td>
</tr>
<tr>
<td>hutool-system</td>
<td>系统参数调用封装（JVM信息等）</td>
</tr>
<tr>
<td>hutool-json</td>
<td>JSON实现</td>
</tr>
<tr>
<td>hutool-captcha</td>
<td>图片验证码实现</td>
</tr>
<tr>
<td>hutool-poi</td>
<td>针对POI中Excel和Word的封装</td>
</tr>
<tr>
<td>hutool-socket</td>
<td>基于Java的NIO和AIO的Socket封装</td>
</tr>
<tr>
<td>hutool-jwt</td>
<td>JSON Web Token (JWT)封装实现</td>
</tr>
</tbody></table>
<h2 id="03、Lombok"><a href="#03、Lombok" class="headerlink" title="03、Lombok"></a>03、Lombok</h2><p>我是在实习的时候接触Lombok这个工具的。他给我的第一感受就是：再也不用自己生成set/get方法了</p>
<p>其实用上了IDE以后，生成set/get方法就是一个快捷键的事，但是每当我们要增加/删除/修改类的属性时，我们都需要额外去为这些变动去生成一次。不过，这好像也不是事。毕竟增加/删除/修改的工作也不是特别多。</p>
<p>其实Lombok能做的事不仅仅只有set/get方法，用上了以后我还是比较推荐用的。像<code>@Builder</code>、<code>@Slf4j</code>、<code>@Data</code>这些注解我在项目中是经常用到的，如果还对Lombok不了解的话，可以去它的官网观望一波。</p>
<p><a target="_blank" rel="noopener" href="https://projectlombok.org/features/all">https://projectlombok.org/features/all</a></p>
<p>有没有人会好奇Lombok它是怎么做到的？曾经有个群里的小伙伴有遇到过这个面试题：你知道Lombok的原理是什么吗？</p>
<p>这个我在《对线面试官》系列的第一篇《注解》曾经聊过。其实不是特别复杂的东西，我们只要能想出Java的编译时大致的步骤以及注解的基础知识，这题就能答上了。</p>
<ol>
<li>注解是有生命周期的<code>@Retention</code>有SOURCE、CLASS和RUNTIME 三个常量，使用Lombok的注解就是SOURCE阶段的</li>
<li><code>.java</code>文件被编译的时候，稍微简化下可以总结为几个步骤：语法分析-&gt;语义分析-&gt;<strong>注解处理</strong>-&gt;class文件</li>
<li>JDK提供了Hook，我们想要在编译时期做注解相关的事，可以继承AbstractProcessor 并实现process方法（Lombok就是这么干的）</li>
</ol>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvzplyb532j30l205kglu.jpg"></p>
<h2 id="04、JSON库"><a href="#04、JSON库" class="headerlink" title="04、JSON库"></a>04、JSON库</h2><p>现在Java后端开发基本上是离不开JSON了，所以我们需要有<strong>JSON库</strong>帮我们做序列化和反序列化</p>
<ul>
<li>前后端接口之间的交互基本上都是JSON格式了</li>
<li>我们有的时候为了方便，也会直接把数据直接转成JSON存储起来（这里的存储可以是MySQL，可以是HBase，可以是Redis 等等）</li>
<li>…</li>
</ul>
<p>写到这里，我翻看了下我以前大学时候的学习笔记。我以前刚学JSON的时候，那时候跟着视频在学Spring和Strtus2，他俩都内置了JSON的解析库。我当时的水平，跟着视频学习调个API对我没什么难度的，所以也不以为然。</p>
<p>没想到，那时候视频教程还教我：如果抛离了Spring和Struts2环境下，那该怎么方便地操作JSON，然后在<code>classpath</code>果断引入了<code>json-lib</code>的包…看回以前大学的笔记，真的是回忆满满…</p>
<p>不扯别的了，说回现在吧。现在Java后端一般使用比较多的JSON库有<code>fastjson</code>、<code>Gson</code>和<code>Jackson</code></p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvzql9iyukj31c805i0t8.jpg"></p>
<p>我以前在公司用<code>FastJson</code>比较多的，<strong>API使用非常简单，日常用得也很舒服</strong>。但是，我是经历过曾经要强制升级fastjson版本的人！应该是19年吧，那时候安全团队告诉我们需要强制升级fastjson的版本，大概就是fastjson有漏洞，一定得升级。这我们作为库的使用方，没办法，那只能升级吧。</p>
<p>结果，没过几天。安全团队又拉了个群，说还是得升级xxx版本以上，之前升级过的版本还有问题…团队内为了升级fastjson版本也遇到过其他的坑，反正就被弄得很烦。</p>
<p>网上也有很多对比这几个JSON库的文章（主要的指标是性能、稳定），有兴趣的小伙伴可以去读读。</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvzr4x2z0vj318i0ocq4a.jpg"></p>
<p>不过，austin项目还是选择fastjson作为JSON主要的序列化库（<strong>多点包容</strong>）</p>
<h2 id="05、HTTP库"><a href="#05、HTTP库" class="headerlink" title="05、HTTP库"></a>05、HTTP库</h2><p>本来HTTP库我是已经忘的了。但正当我要实现发送短信功能的时候，我才恍然想起，HTTP也是经常用到的啊！于是火急地在发送文章之前补充下。</p>
<p>不知道你们第一次用Java调用HTTP的时候，是什么心情。在我印象里，就觉得这东西复杂得一批，调个HTTP真麻烦！后来，工作了以后，在项目里已经有大佬封装过HTTP啦。但还是有的时候，觉得HTTP调用就是那么的复杂（哎，各种头信息，一不小心设置错，那就是半天）</p>
<p>但不管怎么样，HTTP调用是非常常见的，很多公司对外的接口几乎都会提供HTTP调用。比如我们调用腾讯的API下发微信类消息，调用各个渠道商发送短信等等等。</p>
<p>扯远了，还是先回到HTTP库吧。在Java生态中，HTTP库可以大致分为三类：</p>
<ul>
<li>HttpURLConnection</li>
<li>Apache HttpClient</li>
<li>OkHttp</li>
</ul>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gw6k662h9xj31cg05sjrz.jpg"></p>
<p>HttpURLConnection是JDK原始提供的HTTP库，它是没有实现HTTP连接池的（连接池还是非常重要的，池的概念我在这就不过于解释了）。我之前项目用的HTTP库都是Apache HttpClient 基础上封装的（Apache 出品的质量也有保证），而OkHttp可以说是后起之秀了（现在安卓端的HTTP库基本都是基于OkHttp）</p>
<p>一般我们使用这些HTTP工具库，都需要在原生的基础上再写Utils来简化对HTTP的调用，有Utils环境下就会有各类的工具包：</p>
<ul>
<li>比如，上面提到的<code>Hutool</code>就对原生的<code>HttpURLConnection</code>进行封装（不过其封装是没用线程池）</li>
<li>Square公司对自己出品的<code>OkHttp</code>又进行二次封装，开源出<code>Retrofit</code>(这个在安卓用得很多)</li>
<li>Spring环境下提供<code>RestTemplate</code> 多种访问远程Http服务的方法（默认情况下是无线程池的，但可以使用<code>Apache HttpClient</code>和<code>OkHttp</code>将其封装至<code>RestTemplate</code> </li>
<li>SpringCloud环境下提供<code>OpenFeign</code>进而调用HTTP服务</li>
<li>国产HTTP工具库<code>Forest</code>： 对<code>Httpclient</code>和<code>OkHttp</code>进行封装</li>
<li>…</li>
</ul>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gw6k9qahy3j31kq0owq5a.jpg"></p>
<p>这次我选择<code>OkHtpp</code>作为austin的http库</p>
<p>为什么<code>OkHtpp</code>？向前看吧，<code>OkHtpp</code>作为Http库确实现在已然成为标杆（至少在安卓火爆了，很多公司的SDK下都用的Okhttp作为Http库的依赖了）。在Spring环境下<code>RestTemplate</code>也不太好用，我这项目又没上SpringCloud，自然就没用上<code>OpenFeign</code>。<code>Retrofit</code>在安卓用得比较多（Java后端貌似相对较少）。</p>
<p>所以我选择了<code>OkHttp</code>。</p>
<h2 id="06、总结"><a href="#06、总结" class="headerlink" title="06、总结"></a>06、总结</h2><p>这篇文章是来讲austin项目所使用到的工具包，对这些已经懂的人看完可能会觉得有点水，没必要。</p>
<p>但有很多想要跟我一起学习这个项目的同学很多都是没做过项目的，所以我还是觉得有必要发出来总结下。很多时候我们所做的东西，别人觉得很low，其实就在于<strong>信息差</strong>。</p>
<p>我觉得阅读这篇文章的，肯定也会有某些已经工作的小伙伴是没听说过Lombok、没用过Guava这类工具的(Commons应该多多少少都会用过，可能是潜在地用了，但不知道是有专门的apache工具类库）。 </p>
<p>其实这类工具包在项目里使用的频率会非常高，用了这些工具库会让我们的项目代码变得更加简洁，代码可读性和维护性对于一个项目而言是非常重要的。</p>
<p>对于这类工具，我的建议是有空的时候上去看看它能提供什么功能。等发现自己要封装一个工具类的时候，进去看看它们是不是已经实现了，如果实现了直接用就完事了。如果对功能感兴趣的话，看下大佬们是怎么实现的，如果是自己实现的话可能会有哪些地方没想到。</p>
<p>肯定还有很多我还不了解又非常好用的工具包，求各位在评论区推荐推荐啊！！！</p>
<p>Gitee链接：<a target="_blank" rel="noopener" href="https://gitee.com/zhongfucheng/austin">https://gitee.com/zhongfucheng/austin</a></p>
<p>GitHub链接：<a target="_blank" rel="noopener" href="https://github.com/ZhongFuCheng3y/austin">https://github.com/ZhongFuCheng3y/austin</a></p>

</div>


    <div class="post-guide">
        <div class="item left">
            
              <a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/04.%E4%BB%8E%E4%B8%80%E6%9D%A1%E7%9F%AD%E4%BF%A1%E5%BC%80%E5%A7%8B/">
                  <i class="fa fa-angle-left" aria-hidden="true"></i>
                  04.从一条短信开始
              </a>
            
        </div>
        <div class="item right">
            
              <a href="/luffy/2021/11/01/12-austin%E9%A1%B9%E7%9B%AE/00.%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/">
                00.项目介绍
                <i class="fa fa-angle-right" aria-hidden="true"></i>
              </a>
            
        </div>
    </div>




<script>
	
	
</script>
	</div>
	<button id="totop-toggle" class="toggle"><i class="fa fa-angle-double-up" aria-hidden="true"></i></button>
</body>
</html>
